package com.shijimo.server.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.shijimo.server.domain.Category;
import com.shijimo.server.domain.CategoryExample;
import com.shijimo.server.dto.CategoryDto;
import com.shijimo.server.dto.PageDto;
import com.shijimo.server.mapper.CategoryMapper;
import com.shijimo.server.util.CopyUtil;
import com.shijimo.server.util.UuidUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author Dream_飞翔
 * @email 1072876976@qq.com
 */

@Service
public class CategoryService {
    @Resource
    private CategoryMapper categoryMapper;

    /**
     * 查询所有的数据
     */
    public List<CategoryDto> all() {
        CategoryExample categoryExample = new CategoryExample();
        categoryExample.setOrderByClause("sort asc");
        // 进行查询，查询到所有的数据
        List<Category> categoryList = categoryMapper.selectByExample(categoryExample);
        // 转成Dto并返回
        return CopyUtil.copyList(categoryList, CategoryDto.class);
    }

    /**
     * 查询列表方法
     *
     * @param pageDto 分页对象
     */
    public void list(PageDto pageDto) {
        // 开启mybatis分页，pageNum从1开始
        // 生效的位置是开启分页后下方的第一个select语句
        PageHelper.startPage(pageDto.getPage(), pageDto.getSize());

        CategoryExample categoryExample = new CategoryExample();

        categoryExample.setOrderByClause("sort asc");

        // 进行查询
        List<Category> categoryList = categoryMapper.selectByExample(categoryExample);

        PageInfo<Category> pageInfo = new PageInfo<>(categoryList);
        // 查询到的总条数
        pageDto.setTotal(pageInfo.getTotal());

        List<CategoryDto> categoryDtoList = CopyUtil.copyList(categoryList, CategoryDto.class);
        // 设置最终的查询结果
        pageDto.setList(categoryDtoList);
    }

    /**
     * 保存修改结果
     * 1. 如果从前端传来的对象中Id有值的话就是更新操作
     * 2. 如果Id为空则说明是进行新增操作
     *
     * @param categoryDto
     */
    public void save(CategoryDto categoryDto) {
        Category category = CopyUtil.copy(categoryDto, Category.class);
        // 判断Id是否有值
        if (StringUtils.isEmpty(categoryDto.getId())) {
            this.insert(category);
        } else {
            this.update(category);
        }
    }

    /**
     * 添加方法
     */
    private void insert(Category category) {
        // 设置Id
        category.setId(UuidUtil.getShortUuid());
        categoryMapper.insert(category);
    }

    /**
     * 更新方法
     */
    private void update(Category category) {

        categoryMapper.updateByPrimaryKey(category);
    }

    /**
     * 删除方法
     */
    @Transactional
    public void delete(String id) {
        // 先删除子节点
        deleteChildren(id);
        categoryMapper.deleteByPrimaryKey(id);
    }

    /**
     * 删除子分类
     *
     * @param id 传来的id
     */
    public void deleteChildren(String id) {
        Category category = categoryMapper.selectByPrimaryKey(id);
        if ("00000000".equals(category.getParent())) {
            // 如果此时要删除的分类是一级分类，则将其包含的二级分类进行删除
            // 生成条件对象
            CategoryExample categoryExample = new CategoryExample();
            // 定义查询条件
            categoryExample.createCriteria().andParentEqualTo(category.getId());
            // 执行删除子节点
            categoryMapper.deleteByExample(categoryExample);
        }
    }
}
